// TypeScript的基本数据类型
let a:string = 'zs'
let b:number = 12
let c:boolean = false

let d:any = 'ls'  //完全禁用类型检查，允许对变量进行任意操作而不会引发类型错误
let e:unknown = 'sv'  //会保留类型检查，修改变量自身的值‌时无需额外检查,使用该变量时‌强制要求类型确认

let f:null = null
let g:undefined = undefined

// void、never
function fun1():void{
    console.log('23')
    // void是没有返回值
}
function fun2():never{
    console.log('23')
    throw new Error('出错了')
    // 函数不会执行，直接抛出错误
}

console.log("any和unknown数据类型区别演示1:")
// any和unknown数据类型区别演示
d = 26.546
console.log("d:any = 'ls'赋值",d.toFixed(2))

e = 15.42
// let e1 = e.toFixed(2)  //❌ 编译报错：Property 'toFixed' does not exist on type 'unknown'.
if(typeof e === 'number'){
    console.log("e:unknown = 'sv' 赋值",e.toFixed(2))
}  //可以用类型缩小（通过判断断言进行处理）


/* any和unknown数据类型具体区别演示 */
// (1)赋值规则对比
// any类型：可赋值给任意类型变量（关闭类型检查）
let anyVar: any = 'hello' 
let num1: number = anyVar  // ✅ 编译通过（不安全，实际值为string）
let str1: string = anyVar  // ✅ 编译通过

// unknown类型：仅可赋值给unknown或any类型（类型安全）
let unknownVar: unknown = 'world'
// let num2: number = unknownVar  // ❌ 编译报错：Type 'unknown' is not assignable to type 'number'
// let str2: string = unknownVar  // ❌ 编译报错：Type 'unknown' is not assignable to type 'string'
let unknownVar2: unknown = unknownVar  // ✅ 编译通过（仅允许赋值给unknown）
let anyVar2: any = unknownVar  // ✅ 编译通过（仅允许赋值给any）

// (2)操作限制对比
// any类型：可直接执行任意操作（无类型检查，运行时可能报错）
let anyData: any = 'typescript' 
console.log(anyData.toUpperCase())  // ✅ 运行正常（string有toUpperCase方法）
// console.log(anyData.foo())  // ✅ 编译通过，但运行时报错：anyData.foo is not a function
console.log(anyData.bar)  // ✅ 编译通过，运行时输出undefined（属性不存在）

// unknown类型：必须先确认类型才能操作（编译时强制类型安全）
let unknownData: unknown = 'typescript' 
// console.log(unknownData.toUpperCase())  // ❌ 编译报错：Object is of type 'unknown'

// 方案1：类型断言（告诉TS变量的具体类型）
console.log((unknownData as string).toUpperCase())  // ✅ 编译通过，运行正常

// 方案2：类型检查（通过typeof/instanceof细化类型）
if (typeof unknownData === 'string') {
  console.log(unknownData.toUpperCase())  // ✅ 编译通过，运行正常
}
